package org.apli.haiam.admin.jsf.managed;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;
import java.util.ResourceBundle;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.faces.model.DataModel;
import javax.faces.model.SelectItem;
import org.apli.haiam.admin.entidades.UsuarioAdmin;
import org.apli.haiam.ejb.entidades.AdmTipoConsulta;
import org.apli.haiam.ejb.entidades.AdmUsuario;
import org.apli.haiam.ejb.entidades.CexAgenda;
import org.apli.haiam.ejb.entidades.CexEspecialidad;
import org.apli.haiam.ejb.entidades.CexHorariosDia;
import org.apli.haiam.ejb.entidades.CexPreparacion;
import org.apli.jsf.managed.JsfBean;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * Clase backing Bean que administra la entidad CexPreparacion.
 * <p>
 * <H6>Soporte:HAIAM
 * <I>david_s_1086@hotmail.com,david.carranza@haiam.gob.ec</I></H6>
 *
 * @author david Carranza
 * @version 1.0 30/07/2014
 */
@ManagedBean
@ViewScoped
public class JsfPreparacion extends JsfBean<CexPreparacion> {

    final Logger log = LoggerFactory.getLogger(JsfPreparacion.class);
    private CexEspecialidad subEspecialidad;
    private List<CexAgenda> listaAgenda;
    private CexAgenda cexAgenda;
    private CexHorariosDia horarioDia;
    private Integer edad;
    private UsuarioAdmin user;
    private AdmUsuario admUsuario;
    private Date fechaPreparacion;
    private CexPreparacion ultimoPeso;
    private CexPreparacion ultimoRenovacion;
    private boolean activarPeso;
    private boolean activarRenovacion;
    private AdmTipoConsulta admTipoConsulta;

    /**
     * Constructor por defecto.
     */
    public JsfPreparacion() {
    }

    /**
     * Inicializa los datos miembros.
     */
    @Override
    protected void inicializar() {
        //setSwGrabar(false);
        object = new CexPreparacion();
        object.setCprPeso(BigDecimal.ZERO);
        object.setCprTalla(BigDecimal.ZERO);
        listaAgenda = new ArrayList<>();
        cexAgenda = new CexAgenda();
        subEspecialidad = new CexEspecialidad();
        horarioDia = new CexHorariosDia();
        user = (UsuarioAdmin) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("user");
        admUsuario = user.getUser();
        edad = 0;
        ultimoPeso = new CexPreparacion();
        ultimoRenovacion = new CexPreparacion();
        activarPeso = false;
        activarRenovacion = false;
        try {
            fechaPreparacion = admin.getFechaDb();
            if (user.getUser().getAdmEmpleado().getAdmDepartamento().getIdDepartamento().equals(4)) {
                admTipoConsulta = (AdmTipoConsulta) adminObject.buscar(AdmTipoConsulta.class, "atcId", 2);
            } else if (user.getUser().getAdmEmpleado().getAdmDepartamento().getIdDepartamento().equals(2)) {
                admTipoConsulta = (AdmTipoConsulta) adminObject.buscar(AdmTipoConsulta.class, "atcId", 1);
            } else if (user.getUser().getAdmEmpleado().getAdmDepartamento().getIdDepartamento().equals(1) || !user.getUser().getAdmEmpleado().getAdmDepartamento().getIdDepartamento().equals(3)) {
                admTipoConsulta = (AdmTipoConsulta) adminObject.buscar(AdmTipoConsulta.class, "atcId", 1);
            }
        } catch (Exception e) {
            log.error("obtener Fecha() {} ", e.getMessage());
        }
        cargarLista();

    }

    /**
     * Graba el registro asociado al objeto que se administra en la página.
     *
     * @return null, se mantiene en la página invocada.
     */
    @Override
    public String grabarAction() {
        FacesContext context = FacesContext.getCurrentInstance();
        if (cexAgenda.getCexHistoriaClinica() != null) {
            if (object.getCprId() == null) {
                try {
                    if (!admin.existePorCampo(CexPreparacion.class, "cexAgenda.cagFecha", fechaPreparacion, "cexAgenda.cexHistoriaClinica.chcHistoriaClinica", cexAgenda.getCexHistoriaClinica().getChcHistoriaClinica(), "cexAgenda.cexHorariosDia.cexHorario.cexEspecialidadMedico", cexAgenda.getCexHorariosDia().getCexHorario().getCexEspecialidadMedico())) {
                        if (!admin.existePorCampo(CexPreparacion.class, "cexAgenda.cagFecha", cexAgenda.getCagFecha(), "cexAgenda.cexHistoriaClinica.chcHistoriaClinica", cexAgenda.getCexHistoriaClinica().getChcHistoriaClinica(), "cexAgenda.cexHorariosDia.cexHorario.cexEspecialidadMedico", cexAgenda.getCexHorariosDia().getCexHorario().getCexEspecialidadMedico())) {

                            //Verficar si la atencion es de Consulta Externa en caso contrario es de Hospital del Dia
                            if (user.getUser().getAdmEmpleado().getAdmDepartamento().getIdDepartamento().equals(4)) {
                                object.setCprIdUsuario(user.getUser().getIdUsuario().intValue());
                                object.setCprNombreUsuario(user.getUser().getAdmEmpleado().getNombreFull());
                                object.setCprFecha(cexAgenda.getCagFecha());
                                object.setCprHora(admin.getFechaDb());
                                object.setCprObservaciones(object.getCprObservaciones().toUpperCase().trim());
                                object.setCexAgenda(cexAgenda);
                                object.setCprRenova(activarRenovacion);
                                //modifica la historia clinica con relacion a los años del paciente
                                adminObject.modificar(object.getCexAgenda().getCexHistoriaClinica(), (UsuarioAdmin) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("user"));
                                //Modifica la agenda y cambia el estado
                                cexAgenda.setCagEstado(2);
                                adminObject.modificar(cexAgenda, (UsuarioAdmin) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("user"));
                                //grabar preparacion
                                //Validar en el caso de que haga o no tamizaje por renovacion de signos vitales
                                if (!object.getCprRenova()) {
                                    object.setCprEstado(2);
                                } else {
                                    if (cexAgenda.getCexHistoriaClinica().getChcEdad() < 65) {
                                        object.setCprEstado(2);
                                    } else {
                                        object.setCprEstado(1);
                                    }

                                }
                                admin.crear(object, (UsuarioAdmin) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("user"));
                                FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(bundle.getString("msg.grabar")));
                                inicializar();
                            } else {
                                //verificar si el turno es de odontologia
                                if (cexAgenda.getCexHorariosDia().getCexHorario().getCexEspecialidadMedico().getCexEspecialidad().getCexEspecialidad().getCesId() != 6) {

                                    //Verificar si una histora tiene dos turnos con dieferente medico en el mismo dia
                                    List<CexAgenda> listaTmp = adminObject.listar(CexAgenda.class, "cagFecha", cexAgenda.getCagFecha(),
                                            "cexHistoriaClinica.chcHistoriaClinica", cexAgenda.getCexHistoriaClinica().getChcHistoriaClinica());

                                    if (listaTmp.size() > 1) {
                                        CexPreparacion objTemp;
                                        for (CexAgenda objTm : listaTmp) {
                                            //Cargar objeto
                                            objTemp = object;
                                            objTemp.setCprIdUsuario(user.getUser().getIdUsuario().intValue());
                                            objTemp.setCprNombreUsuario(user.getUser().getAdmEmpleado().getNombreFull());
                                            objTemp.setCprFecha(objTm.getCagFecha());
                                            objTemp.setCprHora(admin.getFechaDb());
                                            objTemp.setCprObservaciones(object.getCprObservaciones().toUpperCase().trim());
                                            objTemp.setCexAgenda(objTm);
                                            objTemp.setCprRenova(activarRenovacion);
                                            //Modifica la agenda y cambia el estado
                                            objTm.setCagEstado(2);
                                            adminObject.modificar(objTm, (UsuarioAdmin) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("user"));
                                            //grabar preparacion
                                            //Validar en el caso de que haga o no tamizaje por renovacion de signos vitales
                                            if (!objTemp.getCprRenova()) {
                                                objTemp.setCprEstado(2);
                                            } else {
                                                if (objTm.getCexHistoriaClinica().getChcEdad() < 65) {
                                                    objTemp.setCprEstado(2);
                                                } else {
                                                    objTemp.setCprEstado(1);
                                                }
                                            }
                                            admin.crear(objTemp, (UsuarioAdmin) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("user"));

                                        }
                                        //modifica la historia clinica con relacion a los años del paciente
                                        adminObject.modificar(cexAgenda.getCexHistoriaClinica(), (UsuarioAdmin) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("user"));
                                    } else {
                                        object.setCprIdUsuario(user.getUser().getIdUsuario().intValue());
                                        object.setCprNombreUsuario(user.getUser().getAdmEmpleado().getNombreFull());
                                        object.setCprFecha(cexAgenda.getCagFecha());
                                        object.setCprHora(admin.getFechaDb());
                                        object.setCprObservaciones(object.getCprObservaciones().toUpperCase().trim());
                                        object.setCexAgenda(cexAgenda);
                                        object.setCprRenova(activarRenovacion);
                                        //modifica la historia clinica con relacion a los años del paciente
                                        adminObject.modificar(object.getCexAgenda().getCexHistoriaClinica(), (UsuarioAdmin) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("user"));
                                        //Modifica la agenda y cambia el estado
                                        cexAgenda.setCagEstado(2);
                                        adminObject.modificar(cexAgenda, (UsuarioAdmin) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("user"));
                                        //grabar preparacion
                                        //Validar en el caso de que haga o no tamizaje por renovacion de signos vitales
                                        if (!object.getCprRenova()) {
                                            object.setCprEstado(2);
                                        } else {
                                            if (cexAgenda.getCexHistoriaClinica().getChcEdad() < 65) {
                                                object.setCprEstado(2);
                                            } else {
                                                object.setCprEstado(1);
                                            }

                                        }
                                        admin.crear(object, (UsuarioAdmin) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("user"));
                                    }
                                } else {
                                    object.setCprIdUsuario(user.getUser().getIdUsuario().intValue());
                                    object.setCprNombreUsuario(user.getUser().getAdmEmpleado().getNombreFull());
                                    object.setCprFecha(cexAgenda.getCagFecha());
                                    object.setCprHora(admin.getFechaDb());
                                    object.setCprObservaciones(object.getCprObservaciones().toUpperCase().trim());
                                    object.setCexAgenda(cexAgenda);
                                    object.setCprRenova(activarRenovacion);
                                    //modifica la historia clinica con relacion a los años del paciente
                                    adminObject.modificar(object.getCexAgenda().getCexHistoriaClinica(), (UsuarioAdmin) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("user"));
                                    //Modifica la agenda y cambia el estado
                                    cexAgenda.setCagEstado(2);
                                    adminObject.modificar(cexAgenda, (UsuarioAdmin) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("user"));
                                    //grabar preparacion
                                    //Validar en el caso de que haga o no tamizaje por renovacion de signos vitales
                                    if (!object.getCprRenova()) {
                                        object.setCprEstado(2);
                                    } else {
                                        if (cexAgenda.getCexHistoriaClinica().getChcEdad() < 65) {
                                            object.setCprEstado(2);
                                        } else {
                                            object.setCprEstado(1);
                                        }

                                    }
                                    admin.crear(object, (UsuarioAdmin) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("user"));
                                }
                                FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(bundle.getString("msg.grabar")));
                                inicializar();

                            }

                        } else {
                            FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, "Paciente ya tiene registrados signos vitales en el dia actual con el mismo médico", "Paciente ya tiene registrados signos vitales en el dia actual con el mismo médico"));
                            return null;
                        }
                    } else {
                        FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, "Paciente ya tiene registrados signos vitales en el dia actual con el mismo médico", "Paciente ya tiene registrados signos vitales en el dia actual con el mismo médico"));
                        return null;
                    }
                } catch (Exception e) {
                    log.error("grabarAction() {} ", e.getMessage());
                    FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, e.getMessage(), e.getMessage()));
                }
            } else {
                try {
                    //modifica la historia clinica con relacion a los años del paciente
                    adminObject.modificar(object.getCexAgenda().getCexHistoriaClinica(), (UsuarioAdmin) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("user"));
                    //Modifica la agenda y cambia el estado
                    adminObject.modificar(object.getCexAgenda(), (UsuarioAdmin) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("user"));
                    //Modifica la preparacion
                    admin.modificar(object, (UsuarioAdmin) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("user"));
                    FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(bundle.getString("msg.actualizar")));
                } catch (Exception e) {
                    log.error("grabarAction() {} ", e.getMessage());
                    FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, e.getMessage(), e.getMessage()));
                }
            }
        } else {
            FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, "Debe seleccionar un paciente", "Debe seleccionar un paciente"));
        }

        return null;
    }

    /**
     * Calcula la edad actual del paciente ingresado. parametro la fechaLlegada
     * de nacimiento
     */
    public void calcularEdad() {
        try {
            Calendar birth = new GregorianCalendar();
            Calendar today = new GregorianCalendar();
            SimpleDateFormat age = new SimpleDateFormat("dd-MM-yyyy");

            int factor = 0;
            String birthDate1 = age.format(cexAgenda.getCexHistoriaClinica().getChcFechaNacimiento());
            Date birthDate = new SimpleDateFormat("dd-MM-yyyy").parse(birthDate1);
            Date currentDate = new Date();
            birth.setTime(birthDate);
            today.setTime(currentDate);
            if (today.get(Calendar.MONTH) <= birth.get(Calendar.MONTH)) {
                if (today.get(Calendar.MONTH) == birth.get(Calendar.MONTH)) {
                    if (today.get(Calendar.DATE) > birth.get(Calendar.DATE)) {
                        factor = -1; //Aun no celebra su cumpleaÃ±os
                    }
                } else {
                    factor = -1; //Aun no celebra su cumpleaÃ±os
                }
            }
            cexAgenda.getCexHistoriaClinica().setChcEdad((today.get(Calendar.YEAR) - birth.get(Calendar.YEAR)) + factor);

        } catch (ParseException e) {
            log.error("calcularEdad {}: {} ", e);

        }

    }

    /**
     * Implementa el comportamiento para seleccionar un elemento en una lista de
     * la página.
     *
     * @param item
     * @return null, se mantiene en la página invocada.
     */
    public String seleccionarActionPreparacion(CexAgenda item) {
        String nombreMetodo = Thread.currentThread().getStackTrace()[1].getMethodName() + "()";
        FacesContext context = FacesContext.getCurrentInstance();
        List<CexPreparacion> listatem;
        //inicializar();
        cexAgenda = item;
        calcularEdad();
        edad = cexAgenda.getCexHistoriaClinica().getChcEdad();
        try {
            ultimoPeso = null;
            ultimoRenovacion = null;
            cexAgenda = null;
            cexAgenda = item;
            object.setCprPeso(BigDecimal.ZERO);
            object.setCprTalla(BigDecimal.ZERO);
            if (item.getCagEstado() == 1) {
                if (cexAgenda.getCexHistoriaClinica() != null) {
                    // Duplica la preparacion si antes ya tenia una preparacion en el mismo dia
                    listatem = admin.listarOrdenada(object.getClass(), "cprFecha", cexAgenda.getCagFecha(), "cexAgenda.cexHistoriaClinica", cexAgenda.getCexHistoriaClinica(), "cprFecha", false);
                    if (listatem.size() > 0 || !listatem.isEmpty()) {
                        object.setCexAgenda(cexAgenda);
                        object.setCprAgudezVisualDerecho(listatem.get(0).getCprAgudezVisualDerecho());
                        object.setCprAgudezVisualIzquierda(listatem.get(0).getCprAgudezVisualIzquierda());
                        object.setCprBaniaSolo(listatem.get(0).getCprBaniaSolo());
                        object.setCprCompraSolo(listatem.get(0).getCprCompraSolo());
                        object.setCprDificultadAuditiva(listatem.get(0).getCprDificultadAuditiva());
                        object.setCprDificultadVisual(listatem.get(0).getCprDificultadVisual());
                        object.setCprEstado(2);
                        object.setCprFecha(listatem.get(0).getCprFecha());
                        object.setCprFrecenciaCar(listatem.get(0).getCprFrecenciaCar());
                        object.setCprFrecenciaRes(listatem.get(0).getCprFrecenciaRes());
                        object.setCprHora(adminObject.getFechaDb());
                        object.setCprIdUsuario(user.getUser().getIdUsuario().intValue());
                        object.setCprIdUsuarioTamizaje(user.getUser().getIdUsuario().intValue());
                        object.setCprImc(listatem.get(0).getCprImc());
                        object.setCprLevanaCamina(listatem.get(0).getCprLevanaCamina());
                        object.setCprLevantaAnda(listatem.get(0).getCprLevantaAnda());
                        object.setCprNombreUsuario(user.getUser().getAdmEmpleado().getNombreFull());
                        object.setCprNombreUsuarioTamizaje(user.getUser().getAdmEmpleado().getNombreFull());
                        object.setCprObservaciones(listatem.get(0).getCprObservaciones());
                        object.setCprPerdidaMemoria(listatem.get(0).getCprPerdidaMemoria());
                        object.setCprPerdidaOrina(listatem.get(0).getCprPerdidaOrina());
                        object.setCprPerdidaPeso(listatem.get(0).getCprPerdidaPeso());
                        object.setCprPerimertoCintura(listatem.get(0).getCprPerimertoCintura());
                        object.setCprPerimetroCadera(listatem.get(0).getCprPerimetroCadera());
                        object.setCprPerimetroPantollida(listatem.get(0).getCprPerimetroPantollida());
                        object.setCprPeso(listatem.get(0).getCprPeso());
                        object.setCprRenova(listatem.get(0).getCprRenova());
                        object.setCprSemanaGestacion(listatem.get(0).getCprSemanaGestacion());
                        object.setCprTalla(listatem.get(0).getCprTalla());
                        object.setCprTemperatura(listatem.get(0).getCprTemperatura());
                        object.setCprTensionMaxAcostado(listatem.get(0).getCprTensionMaxAcostado());
                        object.setCprTensionMaxSentado(listatem.get(0).getCprTensionMaxSentado());
                        object.setCprTensionMinAcostado(listatem.get(0).getCprTensionMinAcostado());
                        object.setCprTensionMinSentado(listatem.get(0).getCprTensionMinSentado());
                        object.setCprTristeDeprimido(listatem.get(0).getCprTristeDeprimido());
                        object.setCprViveSolo(listatem.get(0).getCprViveSolo());
                        //Modifica la agenda y cambia el estado
                        cexAgenda.setCagEstado(2);
                        adminObject.modificar(cexAgenda, (UsuarioAdmin) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("user"));
                        //Crea el duplicado de la preparacion
                        admin.crear(object, (UsuarioAdmin) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("user"));
                        FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(bundle.getString("msg.grabar")));
                        inicializar();
                        return null;
                    }

                    //Saca el ultimo peso y a ultima renovacion de la preparacio de acuerdo a la historia clinica
                    listatem.clear();
                    listatem = admin.listarOrdenada(object.getClass(), "cexAgenda.cexHistoriaClinica", cexAgenda.getCexHistoriaClinica(), "cprFecha", false);
                    for (CexPreparacion objCex : listatem) {
                        //Ultimo peso
                        if (!objCex.getCprPeso().equals(new BigDecimal("0.00"))) {
                            ultimoPeso = objCex;
                            break;
                        }
                    }

                    for (CexPreparacion objCexa : listatem) {
                        //Ultima renovacion
                        if (objCexa.getCprRenova()) {
                            ultimoRenovacion = objCexa;
                            break;
                        }
                    }

                } else {
                    FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, "Turno sin historia clínica", "Turno sin historia clínica"));
                }
            }
        } catch (Exception e) {
            log.error("{}: {} ", nombreMetodo, e);
        }
        return null;
    }

    /**
     * Carga la lista de objetos en una lista de la página.
     */
    @Override
    public void cargarLista() {
        String nombreMetodo = Thread.currentThread().getStackTrace()[1].getMethodName() + "()";
        if (admin == null) {
            lista = null;
            return;
        }
        try {
            object = new CexPreparacion();
            cexAgenda = null;
            ultimoPeso = null;
            ultimoRenovacion = null;
            activarPeso = false;
            activarRenovacion = false;
            listaAgenda.clear();

            if (user.getUser().getAdmEmpleado().getAdmDepartamento().getIdDepartamento().equals(4)) {
                listaAgenda = admin.listarOrdenada(CexAgenda.class, "cagFecha", fechaPreparacion, "cexHorariosDia.cexHorario.admTipoConsulta", admTipoConsulta, "cagEstado", 1, "cagHora", true);
                //habilitar para el ingreso de peso en el caso de fisiatria
                activarPeso = true;
            } else {
                listaAgenda = admin.listarOrdenada(CexAgenda.class, "cagFecha", fechaPreparacion, "cagEstado", 1, "cagHora", true);
            }
        } catch (Exception e) {
            log.error("{}: {} ", nombreMetodo, e);
        }
    }

    /**
     * Funcion que divide dos numero BigDecimales en el caso de que el resultado
     * sea mas extenso de lo que este puede abarcar en la expecion lo divide
     * como double
     *
     * @param A
     * @param B
     * @return BigDecimal,
     */
    public static BigDecimal divisionControlada(BigDecimal A, BigDecimal B) {
        try {
            return A.divide(B);
        } catch (Exception e) {
            return new BigDecimal(A.doubleValue() / B.doubleValue());
        }
    }

    /**
     * Calcula el indice de masa corporal.
     */
    public void calcularImc() {
        String nombreMetodo = Thread.currentThread().getStackTrace()[1].getMethodName() + "()";
        if (admin == null) {
            return;
        }
        try {
            if (!object.getCprPeso().equals(BigDecimal.ZERO) && !object.getCprTalla().equals(BigDecimal.ZERO)) {
                BigDecimal elevado = object.getCprTalla().pow(2);
                BigDecimal res = divisionControlada(object.getCprPeso(), elevado).setScale(2, RoundingMode.UP);
                object.setCprImc(res);
                if (object.getCprImc().compareTo(new BigDecimal(16)) == -1) {
                    object.setCprObservaciones("INDICE DE MASA CORPORAL EQUIVALENTE A INFRAPESO (DELGADEZ SEVERA) ");
                } else {
                    if ((object.getCprImc().compareTo(new BigDecimal(16)) == 1 || object.getCprImc().compareTo(new BigDecimal(16)) == 0) && object.getCprImc().compareTo(new BigDecimal(17)) == -1) {
                        object.setCprObservaciones("INDICE DE MASA CORPORAL EQUIVALENTE A INFRAPESO (DELGADEZ MODERADA)");
                    } else {
                        if ((object.getCprImc().compareTo(new BigDecimal(17)) == 1 || object.getCprImc().compareTo(new BigDecimal(17)) == 0) && object.getCprImc().compareTo(new BigDecimal(18.50)) == -1) {
                            object.setCprObservaciones("INDICE DE MASA CORPORAL EQUIVALENTE A INFRAPESO (DELGADEZ ACEPTABLE)");
                        } else {
                            if ((object.getCprImc().compareTo(new BigDecimal(18.50)) == 1 || object.getCprImc().compareTo(new BigDecimal(18.50)) == 0) && object.getCprImc().compareTo(new BigDecimal(25)) == -1) {
                                object.setCprObservaciones("INDICE DE MASA CORPORAL EQUIVALENTE A NORMAL");
                            } else {
                                if ((object.getCprImc().compareTo(new BigDecimal(25)) == 1 || object.getCprImc().compareTo(new BigDecimal(25)) == 0) && object.getCprImc().compareTo(new BigDecimal(30)) == -1) {
                                    object.setCprObservaciones("INDICE DE MASA CORPORAL EQUIVALENTE A SOBREPESO");
                                } else {
                                    if ((object.getCprImc().compareTo(new BigDecimal(30)) == 1 || object.getCprImc().compareTo(new BigDecimal(30)) == 0) && object.getCprImc().compareTo(new BigDecimal(35)) == -1) {
                                        object.setCprObservaciones("INDICE DE MASA CORPORAL EQUIVALENTE A OBESO DE TIPO I");
                                    } else {
                                        if ((object.getCprImc().compareTo(new BigDecimal(35)) == 1 || object.getCprImc().compareTo(new BigDecimal(35)) == 0) && object.getCprImc().compareTo(new BigDecimal(40)) == -1) {
                                            object.setCprObservaciones("INDICE DE MASA CORPORAL EQUIVALENTE A OBESO DE TIPO II");
                                        } else {
                                            if (object.getCprImc().compareTo(new BigDecimal(40)) == 1 || object.getCprImc().compareTo(new BigDecimal(40)) == 0) {
                                                object.setCprObservaciones("INDICE DE MASA CORPORAL EQUIVALENTE A OBESO DE TIPO III");
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            } else {
                object.setCprImc(BigDecimal.ZERO);
                object.setCprObservaciones("NO SE PUDO SACAR IMC DEBIDO A VALORES EN CERO");

            }

        } catch (Exception e) {
            log.error("{}: {} ", nombreMetodo, e);
        }
    }

    /**
     * Calcula rangos de presion arterial pasado los 2 años de edad.
     */
    public void calcularPresionArterial() {
////////////////        String nombreMetodo = Thread.currentThread().getStackTrace()[1].getMethodName() + "()";
////////////////        if (admin == null) {
////////////////            return;
////////////////        }
////////////////        try {
////////////////            if (object.getPreTensioMax() > 0 && object.getPreTensioMin() > 0) {
////////////////                if (object.getPreTensioMax() < 50 && object.getPreTensioMin() < 35) {
////////////////                    object.setPreObservaciones(object.getPreObservaciones().concat(";").concat("PRESION ARTERIAL EQUIVALENTE A MUERTE"));
////////////////                    return;
////////////////                }
////////////////                if ((object.getPreTensioMax() >= 50 && object.getPreTensioMax() < 90) && (object.getPreTensioMin() >= 30 && object.getPreTensioMin() < 60)) {
////////////////                    object.setPreObservaciones(object.getPreObservaciones().concat(";").concat("HIPERTENSIÓN PRESION ARTERIAL BAJA"));
////////////////                    return;
////////////////                }
////////////////                if ((object.getPreTensioMax() >= 90 && object.getPreTensioMax() < 110) && (object.getPreTensioMin() >= 60 && object.getPreTensioMin() < 70)) {
////////////////                    object.setPreObservaciones(object.getPreObservaciones().concat(";").concat("HIPERTENSIÓN PRESION ARTERIAL NORMAL BAJA"));
////////////////                    return;
////////////////                }
////////////////                if ((object.getPreTensioMax() >= 110 && object.getPreTensioMax() < 120) && (object.getPreTensioMin() >= 70 && object.getPreTensioMin() < 80)) {
////////////////                    object.setPreObservaciones(object.getPreObservaciones().concat(";").concat("HIPERTENSIÓN PRESION ARTERIAL NORMAL"));
////////////////                    return;
////////////////                }
////////////////                if ((object.getPreTensioMax() >= 120 && object.getPreTensioMax() < 140) && (object.getPreTensioMin() >= 80 && object.getPreTensioMin() < 90)) {
////////////////                    object.setPreObservaciones(object.getPreObservaciones().concat(";").concat("HIPERTENSIÓN PRESION ARTERIAL NORMAL ALTA"));
////////////////                    return;
////////////////                }
////////////////                if ((object.getPreTensioMax() >= 140 && object.getPreTensioMax() < 160) && (object.getPreTensioMin() >= 90 && object.getPreTensioMin() < 100)) {
////////////////                    object.setPreObservaciones(object.getPreObservaciones().concat(";").concat("HIPERTENSIÓN PRESION ARTERIAL ALTA (BAJA ETAPA 1)"));
////////////////                    return;
////////////////                }
////////////////                if ((object.getPreTensioMax() >= 160 && object.getPreTensioMax() < 180) && (object.getPreTensioMin() >= 100 && object.getPreTensioMin() < 110)) {
////////////////                    object.setPreObservaciones(object.getPreObservaciones().concat(";").concat("HIPERTENSIÓN PRESION ARTERIAL ALTA (MODERADA ETAPA 2)"));
////////////////                    return;
////////////////                }
////////////////                if ((object.getPreTensioMax() >= 180 && object.getPreTensioMax() < 210) && (object.getPreTensioMin() >= 110 && object.getPreTensioMin() < 125)) {
////////////////                    object.setPreObservaciones(object.getPreObservaciones().concat(";").concat("HIPERTENSIÓN PRESION ARTERIAL ALTA (SEVERA ETAPA 3)"));
////////////////                    return;
////////////////                }
////////////////                if ((object.getPreTensioMax() >= 210 && object.getPreTensioMax() < 230) && (object.getPreTensioMin() >= 125 && object.getPreTensioMin() < 140)) {
////////////////                    object.setPreObservaciones(object.getPreObservaciones().concat(";").concat("HIPERTENSIÓN PRESION ARTERIAL ALTA (MUY SEVERA ETAPA 4)"));
////////////////                }
////////////////            } else {
////////////////                object.setPreObservaciones(object.getPreObservaciones().concat(";").concat("NO SE PUDO CALCULAR PRESIÓN ARTERIAL DEBIDO A VALORES EN CERO"));
////////////////            }
////////////////
////////////////        } catch (Exception e) {
////////////////            log.error("{}: {} ", nombreMetodo, e);
////////////////        }
    }

    /**
     * Obtiene una lista de objetos de tipo SelectedItem.
     *
     * @return la lista
     */
    @Override
    public List<SelectItem> getSelectedItem() {
//        try {
//            List<CexPreparacion> datos = admin.listarOrdenada(object.getClass(), "nombre", true);
//            List<SelectItem> items = new ArrayList<SelectItem>();
//            for (CexPreparacion obj : datos) {
//                items.add(new SelectItem(obj.getIdPreparacion()));
//            }
//            return items;
//        } catch (Exception e) {
//            log.error("getSelectedItem() {} ", e.getMessage());
//        }
        return null;
    }

    /**
     * Obtiene una lista de objetos de tipo SelectedItem.
     *
     */
    public void limpiarObjeto() {
        try {
            if (activarPeso && activarRenovacion) {
                activarPeso = false;
                activarRenovacion = false;
            }
        } catch (Exception e) {
            log.error("limpiarObjeto() {} ", e.getMessage());
        }
    }

    public List<SelectItem> getSelectedItemMedico() {
////////////////        try {
////////////////            Date c11 = new Date();
////////////////            Calendar c1 = Calendar.getInstance();
////////////////            c1.setTime(c11);
////////////////            Integer dia = c1.get(Calendar.DAY_OF_WEEK);
////////////////            // lista de registro de la tabla especialidad_medico
////////////////            List<CexHorariosDia> listaHorarioDia = adminObject.listar(CexHorariosDia.class, "cexHorario.cexEspecialidadMedico.cexEspecialidad", subEspecialidad, "cexDia.diaId", dia);
////////////////            List<SelectItem> items = new ArrayList<>();
////////////////            for (CexHorariosDia obj : listaHorarioDia) {
////////////////                if ((obj.getHodHoraInicioAm() != null || obj.getHodHoraFinAm() != null) || (obj.getHodHoraInicioPm() != null || obj.getHodHoraFinPm() != null)) {
////////////////                    items.add(new SelectItem(obj, obj.getCexHorario().getCexEspecialidadMedico().getCexMedico().getMedNombreFull()));
////////////////                }
////////////////
////////////////            }
////////////////            return items;
////////////////        } catch (Exception e) {
////////////////            log.error("getSelectedItemMedico() {} ", e.getMessage());
////////////////        }
        return null;
    }

    @Override
    public DataModel<CexPreparacion> getDataModel() {
        return null;
    }

    public CexEspecialidad getSubEspecialidad() {
        return subEspecialidad;
    }

    public void setSubEspecialidad(CexEspecialidad subEspecialidad) {
        this.subEspecialidad = subEspecialidad;
    }

    public CexHorariosDia getHorarioDia() {
        return horarioDia;
    }

    public void setHorarioDia(CexHorariosDia horarioDia) {
        this.horarioDia = horarioDia;
    }

    public Integer getEdad() {
        return edad;
    }

    public void setEdad(Integer edad) {
        this.edad = edad;
    }

    public CexAgenda getCexAgenda() {
        return cexAgenda;
    }

    public void setCexAgenda(CexAgenda cexAgenda) {
        this.cexAgenda = cexAgenda;
    }

    public Date getFechaPreparacion() {
        return fechaPreparacion;
    }

    public void setFechaPreparacion(Date fechaPreparacion) {
        this.fechaPreparacion = fechaPreparacion;
    }

    public List<CexAgenda> getListaAgenda() {
        return listaAgenda;
    }

    public void setListaAgenda(List<CexAgenda> listaAgenda) {
        this.listaAgenda = listaAgenda;
    }

    public CexPreparacion getUltimoPeso() {
        return ultimoPeso;
    }

    public void setUltimoPeso(CexPreparacion ultimoPeso) {
        this.ultimoPeso = ultimoPeso;
    }

    public CexPreparacion getUltimoRenovacion() {
        return ultimoRenovacion;
    }

    public void setUltimoRenovacion(CexPreparacion ultimoRenovacion) {
        this.ultimoRenovacion = ultimoRenovacion;
    }

    public boolean isActivarPeso() {
        return activarPeso;
    }

    public void setActivarPeso(boolean activarPeso) {
        this.activarPeso = activarPeso;
    }

    public boolean isActivarRenovacion() {
        return activarRenovacion;
    }

    public void setActivarRenovacion(boolean activarRenovacion) {
        this.activarRenovacion = activarRenovacion;
    }

    @Override
    protected ResourceBundle getProperties() {
        return ResourceBundle.getBundle("aplicacion");
    }

    public AdmUsuario getAdmUsuario() {
        return admUsuario;
    }

    public void setAdmUsuario(AdmUsuario admUsuario) {
        this.admUsuario = admUsuario;
    }

}
